package com.example.smssender;

import android.content.Context;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * 数据管理工具类 - 使用SharedPreferences存储联系人和短信模板
 */
public class DataManager {
    private static final String PREFS_NAME = "SmsSenderPrefs";
    private static final String KEY_CONTACTS = "contacts";
    private static final String KEY_SMS_TEMPLATES = "sms_templates";
    private static final String KEY_SEND_RECORDS = "sms_send_records";
    private static final int MAX_RECORDS = 500; // 最多保留500条记录
    
    private static DataManager instance;
    private SharedPreferences prefs;
    private Gson gson;

    private DataManager(Context context) {
        prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        gson = new Gson();
    }

    public static synchronized DataManager getInstance(Context context) {
        if (instance == null) {
            instance = new DataManager(context);
        }
        return instance;
    }

    // ========== 联系人管理 ==========
    
    /**
     * 保存所有联系人
     */
    public void saveContacts(List<Contact> contacts) {
        String json = gson.toJson(contacts);
        prefs.edit().putString(KEY_CONTACTS, json).apply();
    }

    /**
     * 获取所有联系人
     */
    public List<Contact> getContacts() {
        String json = prefs.getString(KEY_CONTACTS, null);
        if (json == null || json.isEmpty()) {
            return new ArrayList<>();
        }
        Type type = new TypeToken<List<Contact>>() {}.getType();
        List<Contact> contacts = gson.fromJson(json, type);
        return contacts != null ? contacts : new ArrayList<>();
    }

    /**
     * 添加联系人
     */
    public void addContact(Contact contact) {
        if (contact == null) {
            return;
        }
        List<Contact> contacts = getContacts();
        contacts.add(contact);
        saveContacts(contacts);
    }

    /**
     * 更新联系人
     */
    public void updateContact(Contact contact) {
        if (contact == null || contact.getId() == null) {
            return;
        }
        List<Contact> contacts = getContacts();
        for (int i = 0; i < contacts.size(); i++) {
            Contact c = contacts.get(i);
            if (c != null && c.getId() != null && c.getId().equals(contact.getId())) {
                contacts.set(i, contact);
                break;
            }
        }
        saveContacts(contacts);
    }

    /**
     * 删除联系人
     */
    public void deleteContact(String contactId) {
        if (contactId == null) {
            return;
        }
        List<Contact> contacts = getContacts();
        contacts.removeIf(contact -> contact != null && contact.getId() != null && contact.getId().equals(contactId));
        saveContacts(contacts);
    }

    /**
     * 根据ID获取联系人
     */
    public Contact getContactById(String id) {
        if (id == null) {
            return null;
        }
        List<Contact> contacts = getContacts();
        for (Contact contact : contacts) {
            if (contact != null && contact.getId() != null && contact.getId().equals(id)) {
                return contact;
            }
        }
        return null;
    }

    // ========== 短信模板管理 ==========
    
    /**
     * 保存所有短信模板
     */
    public void saveSmsTemplates(List<SmsTemplate> templates) {
        String json = gson.toJson(templates);
        prefs.edit().putString(KEY_SMS_TEMPLATES, json).apply();
    }

    /**
     * 获取所有短信模板
     */
    public List<SmsTemplate> getSmsTemplates() {
        String json = prefs.getString(KEY_SMS_TEMPLATES, null);
        if (json == null || json.isEmpty()) {
            return new ArrayList<>();
        }
        Type type = new TypeToken<List<SmsTemplate>>() {}.getType();
        List<SmsTemplate> templates = gson.fromJson(json, type);
        return templates != null ? templates : new ArrayList<>();
    }

    /**
     * 添加短信模板
     */
    public void addSmsTemplate(SmsTemplate template) {
        if (template == null) {
            return;
        }
        List<SmsTemplate> templates = getSmsTemplates();
        templates.add(template);
        saveSmsTemplates(templates);
    }

    /**
     * 更新短信模板
     */
    public void updateSmsTemplate(SmsTemplate template) {
        if (template == null || template.getId() == null) {
            return;
        }
        List<SmsTemplate> templates = getSmsTemplates();
        for (int i = 0; i < templates.size(); i++) {
            SmsTemplate t = templates.get(i);
            if (t != null && t.getId() != null && t.getId().equals(template.getId())) {
                templates.set(i, template);
                break;
            }
        }
        saveSmsTemplates(templates);
    }

    /**
     * 删除短信模板
     */
    public void deleteSmsTemplate(String templateId) {
        if (templateId == null) {
            return;
        }
        List<SmsTemplate> templates = getSmsTemplates();
        templates.removeIf(template -> template != null && template.getId() != null && template.getId().equals(templateId));
        saveSmsTemplates(templates);
    }

    /**
     * 根据ID获取短信模板
     */
    public SmsTemplate getSmsTemplateById(String id) {
        if (id == null) {
            return null;
        }
        List<SmsTemplate> templates = getSmsTemplates();
        for (SmsTemplate template : templates) {
            if (template != null && template.getId() != null && template.getId().equals(id)) {
                return template;
            }
        }
        return null;
    }

    // ========== 发送记录管理 ==========
    
    /**
     * 保存所有发送记录
     */
    private void saveSendRecords(List<SmsSendRecord> records) {
        String json = gson.toJson(records);
        prefs.edit().putString(KEY_SEND_RECORDS, json).apply();
    }

    /**
     * 获取所有发送记录（按时间倒序，最新的在前）
     */
    public List<SmsSendRecord> getSendRecords() {
        String json = prefs.getString(KEY_SEND_RECORDS, null);
        if (json == null || json.isEmpty()) {
            return new ArrayList<>();
        }
        Type type = new TypeToken<List<SmsSendRecord>>() {}.getType();
        List<SmsSendRecord> records = gson.fromJson(json, type);
        if (records == null) {
            return new ArrayList<>();
        }
        // 确保按时间戳倒序排序（最新的在前）
        records.sort((r1, r2) -> {
            if (r1 == null || r2 == null) {
                return 0;
            }
            return Long.compare(r2.getTimestamp(), r1.getTimestamp());
        });
        return records;
    }

    /**
     * 添加发送记录
     */
    public void addSendRecord(SmsSendRecord record) {
        if (record == null) {
            return;
        }
        List<SmsSendRecord> records = getSendRecords();
        // 新记录添加到列表开头（最新的在前）
        records.add(0, record);
        
        // 限制记录数量，避免数据过大
        if (records.size() > MAX_RECORDS) {
            records = new ArrayList<>(records.subList(0, MAX_RECORDS));
        }
        
        saveSendRecords(records);
    }

    /**
     * 删除发送记录
     */
    public void deleteSendRecord(String recordId) {
        if (recordId == null) {
            return;
        }
        List<SmsSendRecord> records = getSendRecords();
        records.removeIf(record -> record != null && record.getId() != null && record.getId().equals(recordId));
        saveSendRecords(records);
    }

    /**
     * 批量删除发送记录
     */
    public void deleteSendRecords(List<String> recordIds) {
        if (recordIds == null || recordIds.isEmpty()) {
            return;
        }
        List<SmsSendRecord> records = getSendRecords();
        records.removeIf(record -> record != null && record.getId() != null && recordIds.contains(record.getId()));
        saveSendRecords(records);
    }

    /**
     * 根据ID获取发送记录
     */
    public SmsSendRecord getSendRecordById(String id) {
        if (id == null) {
            return null;
        }
        List<SmsSendRecord> records = getSendRecords();
        for (SmsSendRecord record : records) {
            if (record != null && record.getId() != null && record.getId().equals(id)) {
                return record;
            }
        }
        return null;
    }

    /**
     * 清空所有发送记录
     */
    public void clearSendRecords() {
        prefs.edit().remove(KEY_SEND_RECORDS).apply();
    }
}
